package booroo.basic;

public class J16_Printer {
	public static void main(String[] args) {
		// 인터페이스 활용하기
		
	} // main
} // class

class PrinterV2{	// super!@!
	private String model;
	private String maker;
	private String type;
	private int papers;
	private int remain;
	// Printer클래스와 달리 메서드는 정의하지 않음
	// 상속관계에 의해 부모클래스의 메서드가 무시당할 것이므로 아예 만들지 않음
}

// 모든 프린터가 기본적으로 제공해야 하는 표준 기능을 인터페이스로 작성
interface PrinterV2Service{
	void print();
	int showRemain();	// 잉크잔량정보 표시
}

// PrinterV2클래스와 PrinterV2Service인터페이스를 이용해서 Inkjet,Laser프린터 클래스 작성
 class InkjetPrinterV2 extends PrinterV2 implements PrinterV2Service{
	
	public void print() {
		System.out.println("잉크젯 프린터입니다!");
	 }
	public int showRemain(){
		return 100;
	}
}
 class LaserPrinterV2 extends PrinterV2 implements PrinterV2Service{
	 
	 public void print() {
		 System.out.println("레이저 프린터입니다!");
	 }
	 
	 // 레이저 프린터에서는 제공하지 않는 기능이지만 인터페이스를 구현했으므로
	 // 어쩔수없이 showRemain메서드 재정의 해야함
	 public int showRemain(){
			return 0;
		}
}
 
// 잉크젯/레이저 프린터 클래스를 작성하기 위해 extends와 implements예약어를 사용하는 것은
// 복잡하므로 간편한 작성을 위해 기본 클래스(base class)개념 도입
// 또, 특정클래스에서 사용하지 않는 메서드임에도 불구하고 인터페이스 규칙상 작성해야 하는 불편함도 존재
// 메서드 선택적 적용을 위해 사용
// 인터페이스를 기본클래스로 구현하게 되면 메서드를 선택적으로 적용가능
// 인터페이스 규칙 우회(인터페이스에 정의된 메서드는 반드시 구현되어야한다는 규칙)

interface PrinterV3Service{
	void print();
	int showRemain();
}

class PrinterV3 implements PrinterV3Service{
	private String model;
	private String maker;
	private String type;
	private int papers;
	private int remain;
	
	public void print(){
		System.out.println("프린터입니다!");
	}
	
	public int showRemain(){
		return 0;
	}

}

class InkjetPrinterV3 extends PrinterV3{
	public void print() {
		System.out.println("잉크젯 프린터입니다!");
	 }
	
	public int showRemain(){
		return 100;
	}
}

class LaserPrinterV3 extends PrinterV3{
	public void print() {
		System.out.println("레이저 프린터입니다!");
	}
}





